<?php
defined( 'BASEPATH' ) or exit( 'No direct script access allowed' );
class File extends MY_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->mylog->set_result( '' );
    }
    function download()
    {
        $gid = 4;
        $id = ( int ) $this->uri->segment( 3 );
        $this->load->model( 'content_model' );
        if ($content = $this->content_model->get( $id, $gid ))
        {
            if (! isset( $this->upload_folder['doc'] ))
            {
                show_404();
            }
            $file = FCPATH . 'public/' . $this->upload_folder['doc'] . $content['file_path'];
            if (! is_file( $file ))
            {
                show_404();
            }
            // 更新下载量
            $this->content_model->update( array (
                    '@clicked' => 'clicked+1' 
            ), $id );
            $filename = $content['file_description'];
            $user_agent = $_SERVER['HTTP_USER_AGENT'];
            if (preg_match( "/MSIE/", $user_agent ))
            {
                header( 'content-disposition:attachment; filename="' . rawurlencode( $filename ) . '"' );
            }
            else if (preg_match( "/Firefox/", $user_agent ))
            {
                header( 'content-disposition:attachment; filename*="utf8\'\'' . $filename . '"' );
            }
            else
            {
                header( 'content-disposition:attachment; filename="' . $filename . '"' );
            }
            @readfile( $file );
            return;
        }
        show_404();
    }
    function verify()
    {
        // 验证码文字
        $length = 4;
        $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $text = '';
        for($i = 0; $i < $length; $i ++)
        {
            $num[$i] = rand( 0, 25 );
            $text .= $str[$num[$i]];
        }
        
        // 存入session
        $session = MySession::get_instance();
        $_SESSION['verify'] = $text;
        
        // 输出图片
        $im_x = 160;
        $im_y = 40;
        $im = imagecreatetruecolor( $im_x, $im_y );
        
        // 背景
        $buttum_c = ImageColorAllocate( $im, rand( 100, 255 ), rand( 100, 255 ), rand( 100, 255 ) );
        imagefill( $im, 0, 0, $buttum_c );
        
        // 文字
        $text_c = ImageColorAllocate( $im, rand( 0, 100 ), rand( 0, 100 ), rand( 0, 100 ) );
        $font = FCPATH . 'public/default/css/t1.ttf';
        for($i = 0; $i < $length; ++ $i)
        {
            imagettftext( $im, 30, rand( 0, 30 ) - 15, 16 + $i * 32, 35, $text_c, $font, $text[$i] );
        }
        
        // 拷贝时扭曲图片
        $distortion_im = imagecreatetruecolor( $im_x, $im_y );
        imagefill( $distortion_im, 0, 0, $buttum_c );
        
        $rand1 = rand( 0, 360 ) * M_PI / 180; // 正弦平移系数
        $amplitude = rand( 5, 10 ); // 正弦振幅系数
        for($i = 0; $i < $im_x; ++ $i)
        {
            for($j = 0; $j < $im_y; ++ $j)
            {
                $rgb = imagecolorat( $im, $i, $j );
                // 拷贝所有点，Y不变，X按正弦规律平移
                $x = $i + ( int ) (sin( M_PI * $j / $im_y + $rand1 ) * $amplitude);
                if (0 <= $x && $x <= $im_x)
                {
                    imagesetpixel( $distortion_im, $x, $j, $rgb );
                }
            }
        }
        ImageDestroy( $im );
        
        // 正弦干扰线
        $move_y = rand( 15, 25 ); // y向平移系数
        $crest = rand( 1, 4 ); // 波峰系数
        for($line_x = 0; $line_x < $im_x; ++ $line_x)
        {
            $line_y = $move_y + ( int ) (sin( $crest * M_PI * $line_x / $im_x + $rand1 ) * $amplitude);
            imagesetpixel( $distortion_im, $line_x, $line_y - 1, $text_c );
            imagesetpixel( $distortion_im, $line_x, $line_y, $text_c );
            imagesetpixel( $distortion_im, $line_x, $line_y + 1, $text_c );
        }
        
        // 干扰象素;
        for($i = 0; $i < 100; ++ $i)
        {
            $randcolor = ImageColorallocate( $distortion_im, rand( 0, 255 ), rand( 0, 255 ), rand( 0, 255 ) );
            imagesetpixel( $distortion_im, rand( 0, $im_x ), rand( 0, $im_y ), $randcolor );
        }
        
        // 设置文件头;
        Header( "Content-type: image/JPEG" );
        
        // 以PNG格式将图像输出到浏览器或文件;
        ImagePNG( $distortion_im );
        
        // 销毁一图像,释放与image关联的内存;
        ImageDestroy( $distortion_im );
    }
    function thumb()
    {
        $s = $this->input->get( 's' );
        if (empty( $s ))
        {
            show_404();
        }
        
        // 第零组：原始字符串
        // 第一组：源图片文件名称
        // 第二组：源文件扩展名及缩略参数
        // 第三组：缩略图保存格式
        if (! preg_match( "/^([0-9a-zA-Z\/]+)_([0-9a-zA-Z]+)\.(jpg|png|gif)$/i", $s, $m ))
        {
            show_404();
        }
        
        // 第零组：原始字符串
        // 第一组：源图片文件扩展名
        // 第二组：缩略图宽(0-4086]
        // 第三组：缩略图高(0-4086]
        // 第四组：缩略图品质质量[0-100]
        // 第五组：模式
        if (! preg_match( "/^T(jpg|png|gif)W(\d+)H(\d+)Q(\d+)M(\d+)$/i", hex2bin( radix( $m[2], 16, 62 ) ), $m1 ))
        {
            show_404();
        }
        
        if (! isset( $this->upload_folder['img'] ))
        {
            show_404();
        }
        $file = FCPATH . 'public/' . $this->upload_folder['img'] . $m[1] . '.' . $m1[1];
        if (! is_file( $file ))
        {
            show_404();
        }
        
        // 获取源图片信息
        $src_infos = getimagesize( $file );
        if (empty( $src_infos ))
        {
            show_404();
        }
        
        // 将源图片载入到资源变量中
        switch ($src_infos[2])
        {
            case 1 :
                if (! function_exists( "imagecreatefromgif" ))
                {
                    show_404();
                }
                $src_img = imagecreatefromgif( $file );
                break;
            case 2 :
                if (! function_exists( "imagecreatefromjpeg" ))
                {
                    show_404();
                }
                $src_img = imagecreatefromjpeg( $file );
                break;
            case 3 :
                $src_img = imagecreatefrompng( $file );
                break;
            default :
                show_404();
        }
        
        // 计算缩略图的宽高
        $src_ratio = $src_infos[0] / $src_infos[1];
        if ($src_ratio > ($m1[2] / $m1[3]))
        {
            // 源图片垂直方向上要比缩略图扁
            $thumb_width = $m1[2];
            $thumb_height = ( int ) ($m1[2] / $src_ratio);
        }
        else
        {
            $thumb_height = $m1[3];
            $thumb_width = ( int ) ($m1[3] * $src_ratio);
        }
        
        if (function_exists( "imagecreatetruecolor" ))
        {
            // 新建一个真彩色图像
            $thumb_img = imagecreatetruecolor( $thumb_width, $thumb_height );
        }
        else
        {
            $thumb_img = imagecreate( $thumb_width, $thumb_height );
        }
        if (function_exists( "imagecopyresampled" ))
        {
            // 重采样拷贝图像并调整大小 可保持较好的清晰度
            imagecopyresampled( $thumb_img, $src_img, 0, 0, 0, 0, $thumb_width, $thumb_height, $src_infos[0], $src_infos[1] );
        }
        else
        {
            imagecopyresized( $thumb_img, $src_img, 0, 0, 0, 0, $thumb_width, $thumb_height, $src_infos[0], $src_infos[1] );
        }
        
        // 保存到文件
        if (! isset( $this->upload_folder['thumb'] ))
        {
            show_404();
        }
        $save_name = FCPATH . 'public/' . $this->upload_folder['thumb'] . $s;
        if (strpos( $s, '/' ) !== false)
        {
            $path = dirname( $save_name );
            if (! file_exists( $path ))
            {
                if (! @mkdir( $path, 0666, true ))
                {
                    show_404();
                }
            }
        }
        switch (strtolower( $m[3] ))
        {
            case 'jpg' :
                imagejpeg( $thumb_img, $save_name, $m1[4] );
                break;
            case 'png' :
                imagepng( $thumb_img, $save_name, $m1[4] );
                break;
            case 'gif' :
                imagegif( $thumb_img, $save_name );
                break;
            default :
                show_404();
        }
        
        // 释放资源
        imagedestroy( $thumb_img );
        imagedestroy( $src_img );
        
        // 跳回图片
        if (is_file( $save_name ))
        {
            // 也许rewrite目录缓存的原因，出现死循环，可将其注释掉
            header( "location:" . base_url() . 'public/' . $this->upload_folder['thumb'] . $s );
        }
    }
}
